package cn.tedu.ivos.user.service.impl;

import cn.tedu.ivos.base.exception.ServiceException;
import cn.tedu.ivos.base.response.StatusCode;
import cn.tedu.ivos.user.mapper.UserMapper;
import cn.tedu.ivos.user.pojo.dto.UserLoginParam;
import cn.tedu.ivos.user.pojo.dto.UserQuery;
import cn.tedu.ivos.user.pojo.dto.UserSaveParam;
import cn.tedu.ivos.user.pojo.entity.User;
import cn.tedu.ivos.user.pojo.vo.UserVO;
import cn.tedu.ivos.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.sql.rowset.serial.SerialException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 业务层实现类必须添加@Service注解
 * 用于声明此类为业务层实现类 后续会注入到Controller类中
 */
@Service
@Slf4j
public class UserServiceImpl implements UserService {
    @Autowired
    UserMapper userMapper;
    @Override
    public UserVO login(UserLoginParam userLoginParam) {
        log.debug("登录业务,参数:{}",userLoginParam);
        UserVO userVO = userMapper.selectByUserName(userLoginParam.getUsername());
        if (userVO==null) {// 根据用户提供的信息进入数据库对比查询 若未找到则调用该函数
            // 业务层不能绕过Controller直接将数据返回前端 若遇到问题 应向外抛出业务层对应的异常
            throw new ServiceException(StatusCode.USERNAME_ERROR);
        }
        // 根据用户提供的姓名正确 但是密码进入数据库进行对比不一致 若不一致则执行下列代码
        if (!userVO.getPassword().equals(userLoginParam.getPassword())) {
            throw new ServiceException(StatusCode.PASSWORD_ERROR);
        }
        return userVO;
    }

    @Override
    public void saveUser(UserSaveParam userSaveParam) {
         User user = new User();
        BeanUtils.copyProperties(userSaveParam,user);
        // 如果没有ID值 说明该操作为新增操作
        if (user.getId()==null) {
            // 注意 员工并非自主注册 因此需要设置初始密码
            user.setPassword("123456");
            // 设置创建时间
            user.setCreateTime(new Date());
            userMapper.insert(user);
        } else {
            // 用户存在 执行`用户编辑`操作 执行更新逻辑
            user.setUpdateTime(new Date());
            userMapper.update(user);
        }
    }

    @Override
    public List<UserVO> selectUser(UserQuery userQuery) {
        List<UserVO> list = userMapper.selectUser(userQuery);
        return list;
    }

    @Override
    public void resetPassword(Long userId) {
        log.debug("重置密码业务: userId={}",userId);
        User user = new User();
        user.setId(userId);
        user.setPassword("root");
        user.setUpdateTime(new Date());
        userMapper.update(user);
    }

    @Override
    public void updateStatus(Long userId, String status) {
        log.debug("更新用户状态业务:userId={},status={}",userId,status);
        User user = new User();
        user.setId(userId);
        user.setStatus(status);
        userMapper.update(user);
    }

    @Override
    public void deleteUser(Long userId) {
        log.debug("删除用户业务:userId={}",userId);
        userMapper.deleteUserById(userId);
    }

    @Override
    public List<UserVO> selectAuditList(Long parentId) {
        ArrayList<UserVO> userVOArrayList = new ArrayList<>();
        // 根据前端传递过来的上级id 查询出直属领导 放入集合中
        UserVO auditUser1 = userMapper.selectById(parentId);
        userVOArrayList.add(auditUser1);
        // 判断传入用户的上级是否存在且该上级有无上级
        if (auditUser1 != null && auditUser1.getParentId() !=null) {
            UserVO auditUser2 = userMapper.selectById(auditUser1.getParentId());
            userVOArrayList.add(auditUser2);
        }
        return userVOArrayList;
    }
}
